#include <iostream>
#include <set>
#include <utility>
#include <string>
using std::cout;
using std::endl;
using std::set;
using std::pair;
using std::string;

void test(){
    //使用无参构造函数创建一个set容器
    set<int> numbers;

    int arr[5] = {1, 2, 3, 4, 5};
    //使用迭代器的方式
    set<int> numbers2(arr, arr + 5);

    //拷贝构造函数的形式
    set<int> numbers3(numbers2);

    //标准初始化列表
    set<int> numbers4 = {1, 2, 3, 4, 5, 6, 7};
}

void test2(){
    //查看set里面的元素
    set<int> numbers = {1, 2, 3, 4, 5, 6, 7};
    //迭代的方式：1.下标 2.增强for循环  3.迭代器
    //因为set没有实现下标访问运算符的重载，所以1排除
    for(auto & ele: numbers){
        cout << ele;
    }
    cout << endl;

    auto it = numbers.begin();
    while(it != numbers.end()){
        cout << *it;
        ++it;
    }
    cout << endl;
}

void test3(){

    set<int> numbers = {1, 2, 3, 4, 5, 6, 7, 10, 9, 20, 15,7};
    for(auto & ele : numbers){
        cout << ele << endl;
    }
}

void test4(){
    set<int> numbers = {1, 2, 3, 4, 5, 6, 7, 10, 9, 20, 15,7};
    //因为set里面的元素不可能是重复的，所以返回的结果要么是1
    //要么是0
    cout << numbers.count(7) << endl;
    cout << numbers.count(16) << endl;
}

void test5(){
    //find的使用
    set<int> numbers = {1, 2, 3, 4, 5, 6, 7, 10, 9, 20, 15,7};
    auto it = numbers.find(16);
    //auto it = numbers.find(7);
    //判断获取到的迭代器是不是end对应的迭代器
    //如果不是，说明找到了，否则没有找到
    if(it != numbers.end()){
        cout << "set中存在该元素" << *it << endl;
    }else {
        cout << "set中不存在该元素" << endl;
    }
}

void test6(){
    //关于pair的使用，其实就是一组key-value键值对
    pair<int,string> stu(1, "zhangsan");
    cout << stu.first << ":" << stu.second << endl;
    //set的insert函数返回结果是一个pair<iterator,bool>
    //第一个iterator指向的是当前的set容器对应的位置的元素
    //第二个bool指的是当前插入操作是否执行成功
    //什么时候会执行插入失败？？？？
    //当前元素已经在set容器中存在，则会插入失败
    set<int> numbers = {1, 2, 3, 4, 5, 6, 7, 10, 9, 20, 15,7};
    //auto result = numbers.insert(25);
    auto result = numbers.insert(7);
    //result的类型是pair类型
    if(result.second){
        cout << "插入成功" << *result.first << endl;
    }else {
        cout << "插入失败" << endl;
    }
}

void test7(){
    set<int> numbers = {1, 2, 3, 4, 5};

    int arr[5] = {1, 2, 7, 9, 10};
    //批量插入方式1
    numbers.insert(arr, arr + 5);
    for(auto & ele : numbers){
        cout << ele << endl;
    }
    //批量插入方式2
    numbers.insert({20, 21, 23, 9, 80});
    for(auto & ele : numbers){
        cout << ele << endl;
    }

    //cout << numbers[0] << endl;error
    auto it = numbers.begin();
    cout << *it << endl;
    //*it = 10;error
}

int main()
{
    test7();
    return 0;
}

